﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using Lamex.Library;
using Lamex.Interface;
using Lamex.mSA.Model;
using System.Diagnostics;
using DevExpress.XtraEditors.TableLayout;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid;
using Lamex.Library.CommonClass;

namespace Lamex.mSA.UI
{
    public partial class frmSA_DN_CBM_WT_Calculate : frmBaseChild
    {
        string strSql;
        DataTable dt;

        public frmSA_DN_CBM_WT_Calculate()
        {
            InitializeComponent();
        }

        private void frmSA_DN_CBM_WT_Calculate_Load(object sender, EventArgs e)
        {
            try { base.InitButtons(); } catch { }//初始化标准功能，因要应用于RibbonForm，所以加入异常处理

            searchLookUpEdit1.Properties.NullText = null;

            gridControl1.Dock = DockStyle.Fill;
            gridControl1.UseEmbeddedNavigator = true;//显示底部数据导航器
            gridView1.OptionsBehavior.Editable = false;

            //单元格合并，合并单元格
            gridView6.OptionsView.AllowCellMerge = true;

            //自动换行
            //1.在FormMain 对应的GridView中编辑columns 的 某个gridcolumn下的 columnEdit为新建MemoEdit
            //2.当前的数据绑定之后添加:GridView1.OptionsView.RowAutoHeight = true;
            gridView6.OptionsView.RowAutoHeight = true;

            strSql = @"SELECT DISTINCT TRANSPORT_NO FROM Transfer_SA_DN_List";
            DataTable dt_DNlist = Lamex.Base.BaseBuildSql.GetDataTableBySql(strSql);

            foreach (DataRow dr in dt_DNlist.Rows)
            {
                comboBoxEdit1.Properties.Items.Add(dr[0].ToString().Trim());
            }

            string CurUser = Lamex.Common.Loginer.CurrentUser.Account;
            //TY Chan|Rocky He|吕相相|罗元盛|王孝莲|杨中杰
            if (CurUser == "TY Chan" || CurUser == "Rocky He" || CurUser == "TX01007" || CurUser == "TX02869" || CurUser == "TX00105" || CurUser == "TX00133")
            {
                checkEdit1.Checked = true;
            }
            //新增鼠标右键功能
            frmGridViewCust.RegisterGrid(gridView1);
            DevStyle.SetGridControlLayout(gridControl1, false);
            //新增鼠标右键功能
            frmGridViewCust.RegisterGrid(gridView2);
            DevStyle.SetGridControlLayout(gridControl2, false);
            //新增鼠标右键功能
            frmGridViewCust.RegisterGrid(gridView3);
            DevStyle.SetGridControlLayout(gridControl3, false);
            //新增鼠标右键功能
            frmGridViewCust.RegisterGrid(gridView4);
            DevStyle.SetGridControlLayout(gridControl4, false);
            //新增鼠标右键功能
            frmGridViewCust.RegisterGrid(gridView5);
            DevStyle.SetGridControlLayout(gridControl5, false);
            //新增鼠标右键功能
            frmGridViewCust.RegisterGrid(gridView6);
            DevStyle.SetGridControlLayout(gridControl6, false);
        }

        private void frmSA_DN_CBM_WT_Calculate_Resize(object sender, EventArgs e)
        {
            splitContainerControl1.SplitterPosition = (this.Height - 60) * 1 / 4;
            splitContainerControl2.SplitterPosition = (this.Height - 60) * 1 / 4;

            splitContainerControl3.SplitterPosition = this.Width / 2;
            splitContainerControl4.SplitterPosition = this.Width / 2;
        }

        //是否返回并显示明细
        private void checkEdit1_CheckedChanged(object sender, EventArgs e)
        {
            resetUI();

            if (checkEdit1.Checked == false)
            {
                splitContainerControl1.SplitterPosition = this.Height - 60;
            }
            else
            {
                splitContainerControl1.SplitterPosition = (this.Height - 60) * 1 / 4;
            }
        }

        //查看计算规则
        private void labelControl3_Click(object sender, EventArgs e)
        {
            checkEdit1.Checked = false;

            splitContainerControl1.SplitterPosition = this.Height - 60;
            gridControl1.Visible = false;
            gridControl1.Dock = DockStyle.None;
            gridControl6.Visible = true;
            gridControl6.Dock = DockStyle.Fill;

            //            strSql = @"SELECT LEVEL_01 AS 层级1,
            //LEVEL_02 AS 层级2,
            //LEVEL_03 AS 层级3,
            //LEVEL_04 AS 层级4,
            //LEVEL_05 AS 层级5,
            //CAL_TYPE AS 计算方法,
            //TABLE_FIELD AS [表/字段或数据],
            //CAL_CONDITION AS 计算条件,
            //CBM_LOGIC AS CBM返回逻辑,
            //WT_LOGIC AS 重量返回逻辑,
            //UPDATE_TIME AS 更新时间,
            //UPDATE_USER AS 更新用户
            //FROM WH_CBM_WT_Cal_Rules";
            strSql = @"SELECT * FROM WH_CBM_WT_Cal_Rules";
            DataTable dt_Rules = Lamex.Base.BaseBuildSql.GetDataTableBySql(strSql);
            gridControl6.DataSource = dt_Rules;
        }

        //根据DN编号，加载DN清单
        private void comboBoxEdit1_SelectedIndexChanged(object sender, EventArgs e)
        {
            resetUI();
            searchLookUpEdit1.EditValue = null;
            strSql = @"SELECT ORDER_NO AS OR号,LINE_NO AS 行号,MATERIAL_NO AS 物料,MATERIAL_DESC AS 描述,
MO_NO AS 生产订单,PRODUCT_LINE AS 生产线,PRODUCT_ROUTING AS 工艺路线
FROM Transfer_SA_DN_List
WHERE TRANSPORT_NO='" + comboBoxEdit1.Text + @"'";

            DataTable dt_DN = Lamex.Base.BaseBuildSql.GetDataTableBySql(strSql);
            searchLookUpEdit1.Properties.ValueMember = "物料";
            searchLookUpEdit1.Properties.DisplayMember = "物料";
            searchLookUpEdit1.Properties.DataSource = dt_DN;
            searchLookUpEdit1.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor;
            searchLookUpEdit1.Properties.ImmediatePopup = true;
            searchLookUpEdit1.Properties.NullText = "选择产品物料号码";
        }

        //清空gridcontrol
        private void searchLookUpEdit1_EditValueChanged(object sender, EventArgs e)
        {
            gridControl2.DataSource = null;
            gridControl3.DataSource = null;
            gridControl4.DataSource = null;
            gridControl5.DataSource = null;
        }

        //重置用户界面
        private void resetUI()
        {
            gridControl1.Visible = true;
            gridControl1.Dock = DockStyle.Fill;
            gridControl6.Visible = false;
            gridControl6.Dock = DockStyle.None;
        }

        //按用户预选条件刷新DN数据（含已计算出的CBM及重量）
        private void sbtnRefresh_Click(object sender, EventArgs e)
        {
            string strDN_No = comboBoxEdit1.Text.ToString();
            string strSAP_No = searchLookUpEdit1.EditValue != null ? searchLookUpEdit1.EditValue.ToString() : "";
            string strWhere = null;

            if (string.IsNullOrEmpty(strDN_No))
            {
                strWhere = null;
            }
            else
            {
                if (string.IsNullOrEmpty(strSAP_No))
                {
                    strWhere = "WHERE TRANSPORT_NO='" + strDN_No + @"'";
                }
                else
                {
                    strWhere = "WHERE TRANSPORT_NO='" + strDN_No + @"' AND MATERIAL_NO='" + strSAP_No + @"'";
                }
            }

            strSql = @"SELECT a.TRANSPORT_NO ,a.ORDER_NO ,a.LINE_NO ,a.SL ,a.MATERIAL_NO ,
            a.MATERIAL_DESC ,a.MO_NO ,a.PRODUCT_LINE ,a.PRODUCT_ALLOCATION ,a.SHIPPING_QTY ,a.PRODUCT_ROUTING ,
            b.CARTON_QTY ,b.VOLUME_LENGTH,b.VOLUME_WIDTH,b.VOLUME_HEIGHT,
            b.UNIT_VOLUME ,SHIPPING_VOLUME,
            b.UNIT_WEIGHT ,SHIPPING_WEIGHT,
            b.SAVE_USER ,b.SAVE_TIME ,a.TEST_REMARK ,b.CAL_TYPE,a.ORDER_QTY,a.MRP_CONTROLLER
            FROM
            (SELECT *
            FROM Transfer_SA_DN_List "
            + strWhere + @") AS a
            LEFT JOIN SA_CBM_WT_Calculated AS b
            ON a.TRANSPORT_NO=b.TRANSPORT_NO AND a.ORDER_NO=b.ORDER_NO AND a.LINE_NO=b.LINE_NO";

            dt = Lamex.Base.BaseBuildSql.GetDataTableBySql(strSql);
            gridControl1.DataSource = dt;
        }

        //CBM及重量计算
        private void sbtnCalculate_Click(object sender, EventArgs e)
        {
            //***加定时器，计时
            Stopwatch sw = new Stopwatch();
            sw.Start();
            bool resultFlag = false;
            try
            {
                SplashScreenTool.ShowSplashScreen(typeof(WaitForm1));
                //按用户筛选条件重新匹配DataTable
                if (gridView1.ActiveFilterCriteria != null)
                {
                    var filteredDataView = new DataView(gridControl1.DataSource as DataTable);
                    filteredDataView.RowFilter =
                        DevExpress.Data.Filtering.CriteriaToWhereClauseHelper.GetDataSetWhere(gridView1.ActiveFilterCriteria);
                    dt = filteredDataView.ToTable();
                }
                if (dt != null && dt.Rows.Count > 0)
                {
                    //前台板材、铝材清单
                    DataTable dt_Board_Aluminum = new DataTable();
                    string sapError = "";
                    //获得单位转换表
                    DataTable table_UnitConvert = Common.CRUDHelper.Get_Unit_Convert();
                    #region 包装体基础数据获取并更新
                    //获取DN单去重的物料号
                    DataTable table_mes = Common.DataTableHelper.Distinct(dt, new string[] { "MATERIAL_NO" });
                    //修改物料列名为SAP对接列名
                    table_mes.Columns["MATERIAL_NO"].ColumnName = "MATNR";
                    //获取SAP传回来的数据
                    DataTable table_sap = Common.GetSapData.ReturnSapTable(table_mes, out sapError);
                    if (sapError.Trim().Length > 0)
                    {
                        DevExpress.XtraEditors.XtraMessageBox.Show("无法根据DN表取得SAP数据！\r\n" + sapError, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                    //重新修改SAP回传数据表的字段名
                    table_sap = Common.GetDataTable.dataTable_NewColums(table_sap);
                    //获取【SA_CBM_WT_From_SAP】符合条件的数据
                    DataTable table_cbm_wt = Common.GetDataTable.Get_SA_CBM_WT_From_SAP();
                    DataTable dtRetDif = new DataTable();//定义table_sap与table_cbm_wt对比后返回的不同数据(差异部分包含本身table_sap)
                    DataTable dtRetDif2 = new DataTable();//定义需要更新的DataTable
                                                          //获取两表差异数据table_sap、table_cbm_wt 字段顺利必需一致
                    Common.DataTableHelper.CompareDt(table_sap, table_cbm_wt, "MATERIAL_NO", out dtRetDif2, out dtRetDif);
                    //得到差异部分插入更新数据表【SA_CBM_WT_From_SAP】
                    //新增两行到表dtRetDif
                    dtRetDif = Common.GetDataTable.dataTable_AddColums(dtRetDif);
                    if (Common.CRUDHelper.Insert_Batch(dtRetDif, "SA_CBM_WT_From_SAP"))
                    {
                        //成功插入后再更新 
                        Common.CRUDHelper.Update_Table(dtRetDif2);
                    }
                    #endregion

                    #region MO BOM物料基础数据获取并更新
                    //获取【MO_BOM】符合条件的数据--因在100多万数据中查询，速度会慢                        
                    DataTable table_mes_mo_bom = Common.GetDataTable.Get_MO_BOM(dt);
                    //再次通过SAP接口获取返回结果
                    table_mes_mo_bom.Columns["MATERIAL_NO"].ColumnName = "MATNR";
                    //获取SAP传回来的数据
                    DataTable table_sap_mo_bom = Common.GetSapData.ReturnSapTable(table_mes_mo_bom, out sapError);
                    if (sapError.Trim().Length > 0)
                    {
                        DevExpress.XtraEditors.XtraMessageBox.Show("无法根据MO_BOM表取得SAP数据！\r\n" + sapError, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                    //重新修改SAP回传数据表的字段名
                    table_sap_mo_bom = Common.GetDataTable.dataTable_NewColums(table_sap_mo_bom);
                    DataTable dtRetDif_Add = new DataTable();//定义需要插入的DataTable
                    DataTable dtRetDif_Update = new DataTable();//定义需要更新的DataTable
                    Common.DataTableHelper.CompareDt(table_sap_mo_bom, table_cbm_wt, "MATERIAL_NO", out dtRetDif_Update, out dtRetDif_Add);
                    dtRetDif_Add = Common.GetDataTable.dataTable_AddColums(dtRetDif_Add);
                    if (Common.CRUDHelper.Insert_Batch(dtRetDif_Add, "SA_CBM_WT_From_SAP"))
                    {
                        //成功插入后再更新 
                        Common.CRUDHelper.Update_Table(dtRetDif_Update);
                    }
                    //回刷最终SAP数据到页面
                    table_sap.Merge(table_sap_mo_bom);
                    gridControl2.DataSource = table_sap;
                    #endregion

                    #region 后台临时表创建及取人工修正数据
                    //取人工修正数据
                    //***同时加人工修正标记，即在计算方法(Cal_Type)列写入‘人工修正‘，后面将不再执行其他计算逻辑，等同于SL not in ('CE','CN')
                    DataTable table_manual = Common.GetDataTable.Get_WH_CBM_WT_Revised();
                    DataTable table_Temp = Common.GetDataTable.Get_SA_CBM_WT_Calculated();
                    DataTable table_DN_Temp = table_Temp.Clone();
                    table_DN_Temp = Common.GetDataTable.Insert_DataTable(dt, table_DN_Temp, table_manual);

                    //***测试队段只复制工艺路线之前的字段，后面计算字段不复制，以便可以反复测试
                    //***正式发布时按用户需求确定是仅复制非计算字段（全部重算），还量全部复制（即跳过有重量的项目）
                    //***如果用户要求任何情况下，均全部重算，则可取消后面检查重量为0逻辑-2020/9/3
                    if (table_DN_Temp.Select("SL not in ('CE','CN') ").Length > 0)
                        table_DN_Temp = table_DN_Temp.Select("SL not in ('CE','CN')").CopyToDataTable();
                    else
                    {
                        DevExpress.XtraEditors.XtraMessageBox.Show("不存在符合CBM及重量计算的组件类型！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                    //回刷MO_BOM数据到页面
                    DataTable dt_MO_NO = Common.DataTableHelper.Distinct(table_DN_Temp, new string[] { "MO_NO" });
                    DataTable dt_MO_BOM = Common.GetDataTable.Get_Table_NoOEM_BOM(dt_MO_NO);
                    //gridControl3.DataSource = dt_MO_BOM;
                    #endregion

                    #region OEM产品及配件CBM及重量计算

                    //***OEM产品CBM及重量计算
                    //***逻辑为SL not in ('CE','CN')，及非人工修正数据(Cal_Type != ‘人工修正’)，且PRODUCT_LINE='OEM'
                    if (table_DN_Temp.Select("PRODUCT_LINE='OEM' and Cal_Type<>'人工修正'").Length > 0)//???
                    {
                        //判断是否为OEM产品
                        //***如为OEM产品，计算并在’Cal_Type列写入’来源SAP'
                        DataTable table_DN_Temp_OEM = new DataTable();
                        table_DN_Temp_OEM = table_DN_Temp.Select("PRODUCT_LINE='OEM' and Cal_Type<>'人工修正' ").CopyToDataTable();
                        if (table_DN_Temp_OEM.Rows.Count > 0)
                        {
                            DataTable table_Material_OEM = Common.DataTableHelper.Distinct(table_DN_Temp_OEM, new string[] { "MATERIAL_NO" });
                            table_DN_Temp = Common.GetDataTable.Get_Table_OEM(table_DN_Temp, table_Material_OEM, table_UnitConvert);
                        }
                    }
                    //***配件CBM及重量计算
                    //***逻辑为SL not in ('CE','CN')，及非人工修正数据(Cal_Type != '人工修正")，且工艺路线包含D54、P79、或S20
                    //判断是否为配件产品
                    //???配件不属于OEM产品，同OEM产品同级
                    //***如为配件，计算并在’Cal_Type列写入’来源SAP'
                    //***速度太慢，此逻辑不需要取[开料尺寸]，只需要解析纸箱，请检查

                    if (table_DN_Temp.Select("Cal_Type<>'人工修正' and (PRODUCT_ROUTING like'%D54%' OR PRODUCT_ROUTING like'%P79%' OR PRODUCT_ROUTING like'%S20%') ").Length > 0)
                    {
                        DataTable table_DN_Temp_PJ = new DataTable();
                        table_DN_Temp_PJ = table_DN_Temp.Select("Cal_Type<>'人工修正' and (PRODUCT_ROUTING like'%D54%' OR PRODUCT_ROUTING like'%P79%' OR PRODUCT_ROUTING like'%S20%') ").CopyToDataTable();
                        if (table_DN_Temp_PJ.Rows.Count > 0)
                        {
                           // DataTable table_Material_PJ = Common.DataTableHelper.Distinct(table_DN_Temp_PJ, new string[] { "MATERIAL_NO" });
                            //table_DN_Temp = Common.GetDataTable.Get_Table_OEM(table_DN_Temp, table_Material_PJ, table_UnitConvert);

                            // update by Bill 2021.03.25
                            DataTable dt_Mo_Main = Common.DataTableHelper.Distinct(table_DN_Temp_PJ, new string[] { "MO_NO" });
                            DataTable table_DN_Temp_MO = Common.GetDataTable.Get_Table_NoOEM_BOM(dt_Mo_Main);//[MO_BOM]表
                            List<CartonMaterial> cartons = new List<CartonMaterial>();
                            DataTable dt_Carton_Mo = new DataTable();//定义纸箱包装的BOM数据表
                            cartons = Calculate.Fuc_CBM.CARTON_PACKING_CBM(table_DN_Temp_MO, dt_Mo_Main, out dt_Carton_Mo);                           
                            //纸箱包装
                            table_DN_Temp = Common.GetDataTable.Get_Table_PJ(table_DN_Temp, table_DN_Temp_PJ, table_UnitConvert, cartons);
                        }
                    }
                    #endregion

                    #region 钢脚重量和CBM计算
                    if (table_DN_Temp.Select("MRP_CONTROLLER='G00'").Length > 0)
                    {
                        DataTable dataTable = table_DN_Temp.Select("MRP_CONTROLLER='G00'").CopyToDataTable();
                        //Bill Test
                        //DataTable table_DN_List = Common.GetDataTable.GetTable_SA_DN_List(table_DN_Temp);
                        //var query = (from d in table_DN_Temp.AsEnumerable()
                        //             join l in table_DN_List.AsEnumerable()
                        //             on d.Field<string>("TRANSPORT_NO") equals l.Field<string>("TRANSPORT_NO")
                        //             where l.Field<string>("MRP_CONTROLLER") == "G00"
                        //             select d).ToList();


                        DataTable dt_Mo_Main1 = Common.DataTableHelper.Distinct(dataTable, new string[] { "MO_NO" });
                        DataTable table_DN_Temp_MO1 = Common.GetDataTable.Get_Table_NoOEM_BOM(dt_Mo_Main1);
                        List<CartonMaterial> cartons1 = new List<CartonMaterial>();
                        DataTable dt_Carton_Mo1 = new DataTable();//定义纸箱包装的BOM数据表
                        cartons1 = Calculate.Fuc_CBM.CARTON_PACKING_CBM(table_DN_Temp_MO1, dt_Mo_Main1, out dt_Carton_Mo1);
                        DataTable table_MateralParts = Common.GetDataTable.GetMertalParts(dataTable);
                        DataTable table_Decor = Common.GetDataTable.GetMertalParts_Decor();
                        table_DN_Temp = Common.GetDataTable.Get_Table_MetalParts(table_DN_Temp, dataTable, cartons1, table_MateralParts, table_Decor);

                    }
                        #endregion

                    #region 计算非OEM非配件产品CBM
                    //***逻辑为SL not in ('CE','CN')，及人工修正数据(Cal_Type列为入人工修正)，且PRODUCT_LINE='Laminate'
                    //非OEM桌子产品临时数据？？？
                    //***逻辑为SL not in ('CE','CN')，及非人工修正数据(Cal_Type != ‘人工修正’)，
                    //***且（PRODUCT_LINE !='OEM'，或工艺路线不包含D54、P79、或S20）


                    if (table_DN_Temp.Select("PRODUCT_LINE='Laminate' and Cal_Type <> '人工修正' ").Length > 0)
                    {
                        DataTable table_DN_Temp_NoOEM = table_DN_Temp.Select("PRODUCT_LINE='Laminate' and Cal_Type <> '人工修正' ").CopyToDataTable();
                        if (table_DN_Temp_NoOEM.Select(" PRODUCT_ROUTING like'%D44%' OR PRODUCT_ROUTING like'%D47%'").Length > 0)
                        {
                            DataTable dataTable = table_DN_Temp_NoOEM.Select(" PRODUCT_ROUTING like'%D44%' OR PRODUCT_ROUTING like'%D47%'").CopyToDataTable();
                            //增加工艺路线不包含D54、P79、或S20
                            if (dataTable.Select("PRODUCT_ROUTING not like'%D54%' AND PRODUCT_ROUTING not like'%P79%' AND PRODUCT_ROUTING not like'%S20%' ").Length > 0)
                            {
                                DataTable table_DN_Temp_NoOEM_Lamin = dataTable.Select("PRODUCT_ROUTING not like'%D54%' AND PRODUCT_ROUTING not like'%P79%' AND PRODUCT_ROUTING not like'%S20%' ").CopyToDataTable();
                                table_DN_Temp = Common.GetDataTable.Get_Table_NoOEM_Lamint(table_DN_Temp, table_DN_Temp_NoOEM_Lamin);
                            }
                        }
                    }

                    //非OEM非桌子组装
                    if (table_DN_Temp.Select("ISNULL(MO_NO,'')<>'' and PRODUCT_LINE<>'OEM' and Cal_Type <> '人工修正' ").Length > 0)
                    {
                        DataTable dt_Temp_MO = table_DN_Temp.Select("ISNULL(MO_NO,'')<>'' and PRODUCT_LINE<>'OEM' and Cal_Type <> '人工修正' ").CopyToDataTable();
                        //增加工艺路线不包含D54、P79、或S20
                        if (dt_Temp_MO.Select("PRODUCT_ROUTING not like'%D54%' AND PRODUCT_ROUTING not like'%P79%' AND PRODUCT_ROUTING not like'%S20%' ").Length > 0)
                        {
                            //增加工艺路线不包含D44、D47
                            DataTable dataTable = dt_Temp_MO.Select("PRODUCT_ROUTING not like'%D54%' AND PRODUCT_ROUTING not like'%P79%' AND PRODUCT_ROUTING not like'%S20%' ").CopyToDataTable();
                            if (dataTable.Select(" PRODUCT_ROUTING not like'%D44%' AND PRODUCT_ROUTING not like'%D47%'").Length > 0)
                            {
                                DataTable dt_MO = dataTable.Select(" PRODUCT_ROUTING not like'%D44%' AND PRODUCT_ROUTING not like'%D47%'").CopyToDataTable();
                                DataTable dt_Mo_Main = Common.DataTableHelper.Distinct(dt_MO, new string[] { "MO_NO" });
                                DataTable table_DN_Temp_MO = Common.GetDataTable.Get_Table_NoOEM_BOM(dt_Mo_Main);//[MO_BOM]表
                                List<CartonMaterial> cartons = new List<CartonMaterial>();
                                DataTable dt_Carton_Mo = new DataTable();//定义纸箱包装的BOM数据表
                                cartons = Calculate.Fuc_CBM.CARTON_PACKING_CBM(table_DN_Temp_MO, dt_Mo_Main, out dt_Carton_Mo);
                                //纸箱包装
                                if (cartons.Count > 0)
                                {
                                    //纸箱清单
                                    gridControl4.DataSource = cartons;
                                    table_DN_Temp = Common.GetDataTable.Get_Table_NoOEM_NoLamint(cartons, table_DN_Temp);
                                }
                                //其他包装
                                //获取两个数据表的差集（去掉纸箱包装的BOM，剩下的就是其他包装）
                                IEnumerable<DataRow> dt_CJ_TEMP = dt_Mo_Main.AsEnumerable().Except(dt_Carton_Mo.AsEnumerable(), DataRowComparer.Default);
                                if (dt_CJ_TEMP.ToList().Count > 0)
                                {
                                    DataTable dt_CJ_BOM = dt_CJ_TEMP.CopyToDataTable();
                                    if (dt_CJ_BOM.Rows.Count > 0)
                                    {
                                        DataTable dt_Board_Alum = new DataTable();//前台板材、铝材清单
                                        table_DN_Temp = Common.GetDataTable.Get_CutSizeTable(table_DN_Temp, table_DN_Temp_MO, dt_CJ_BOM, out dt_Board_Alum);
                                        dt_Board_Aluminum.Merge(dt_Board_Alum);
                                    }
                                }
                            }
                        }
                    }
                    #endregion

                    #region 计算非OEM及非配件产品重量
                    //***逻辑为SL not in ('CE','CN')，及非人工修正数据(Cal_Type != ‘人工修正’)，
                    //***且（PRODUCT_LINE !='OEM'，或工艺路线不包含D54、P79、或S20）
                    //***且MO_NO不为空
                    if (table_DN_Temp.Select("ISNULL(MO_NO,'')<>'' AND ISNULL(UNIT_WEIGHT,'0')='0' and Cal_Type <> '人工修正' and PRODUCT_LINE<>'OEM' ").Length > 0)
                    {
                        DataTable dt_Weight_Temp = table_DN_Temp.Select("ISNULL(MO_NO,'')<>'' AND ISNULL(UNIT_WEIGHT,'0')='0' and Cal_Type <> '人工修正' and PRODUCT_LINE<>'OEM' ").CopyToDataTable();
                        //增加工艺路线不包含D54、P79、或S20
                        if (dt_Weight_Temp.Select("PRODUCT_ROUTING not like'%D54%' AND PRODUCT_ROUTING not like'%P79%' AND PRODUCT_ROUTING not like'%S20%' ").Length > 0)
                        {
                            DataTable dt_Weight = dt_Weight_Temp.Select("PRODUCT_ROUTING not like'%D54%' OR PRODUCT_ROUTING not like'%P79%' OR PRODUCT_ROUTING not like'%S20%' ").CopyToDataTable();
                            //称重计重法
                            //***适用PRODUCT_LINE='Seating' OR PRODUCT_LINE='MCG'
                            if (dt_Weight.Select("PRODUCT_LINE='Seating' OR PRODUCT_LINE='MCG'").Length > 0)
                            {
                                DataTable dt_Weight_Seat_MCG = dt_Weight.Select("PRODUCT_LINE='Seating' OR PRODUCT_LINE='MCG'").CopyToDataTable();
                                DataTable dt_Mo_Main = Common.DataTableHelper.Distinct(dt_Weight_Seat_MCG, new string[] { "MO_NO" });
                                table_DN_Temp = Common.GetDataTable.Get_Table_NoOEM_Weight(table_DN_Temp, dt_Mo_Main, dt_MO_BOM);
                            }

                            //BOM计重法
                            //***适用PRODUCT_LINE='Laminate' OR PRODUCT_LINE='Panel'
                            if (dt_Weight.Select("PRODUCT_LINE='Laminate' OR PRODUCT_LINE='Panel'").Length > 0)
                            {
                                DataTable dt_Weight_Lamin_Panel = dt_Weight.Select("PRODUCT_LINE='Laminate' OR PRODUCT_LINE='Panel'").CopyToDataTable();
                                DataTable dt_Mo_Main = Common.DataTableHelper.Distinct(dt_Weight_Lamin_Panel, new string[] { "MO_NO" });
                                DataTable table_DN_Temp_MO = Common.GetDataTable.Get_Table_NoOEM_BOM(dt_Mo_Main);//[MO_BOM]表
                                DataTable dt_Weight_Per_Square = Common.GetDataTable.Get_Weight_Per_Square();
                                DataTable dt_Board_Alum = new DataTable();//前台板材、铝材清单
                                table_DN_Temp = Common.GetDataTable.Get_Table_NoOEM_BOM_Weight(table_DN_Temp, table_DN_Temp_MO, dt_Mo_Main, dt_Weight_Per_Square, table_cbm_wt, dt_MO_BOM, out dt_Board_Alum);
                                dt_Board_Aluminum.Merge(dt_Board_Alum);

                            }
                        }
                    }
                    #endregion

                    #region 前台板材、铝材清单 | MO_BOM
                    gridControl3.DataSource = dt_MO_BOM;
                    if (dt_Board_Aluminum != null && dt_Board_Aluminum.Rows.Count > 0)
                    {
                        DataView dv = new DataView(dt_Board_Aluminum);
                        string[] columnsArray = { "Material_No", "ORDER_NUMBER", "MATERIAL_DESC", "Carton_Qty", "Length", "Width", "Thick", "Measure_Area", "ROUTING_CODE", "MATERIAL_CODE", "Base_Unit" };
                        gridControl5.DataSource = dv.ToTable(true, columnsArray);
                    }
                    #endregion

                    #region 计算[临时DN表]出货CBM及重量
                    table_DN_Temp = Common.GetDataTable.Get_Table_CBM_Weight(table_DN_Temp);
                    #endregion

                    #region 回写数据表
                    //删除重复数据
                    Common.CRUDHelper.Delete_Table(table_DN_Temp);
                    if (Common.CRUDHelper.Insert_Batch(table_DN_Temp, "SA_CBM_WT_Calculated"))
                    {
                        //成功插入刷新页面
                        sbtnRefresh_Click(null, null);
                        resultFlag = true;
                    }
                    #endregion
                }
                else
                {
                    DevExpress.XtraEditors.XtraMessageBox.Show("无DN单数据！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
                SplashScreenTool.CloseSplashScreen();
            }
            catch (Exception ex)
            {
                SplashScreenTool.CloseSplashScreen();
                //DevExpress.XtraEditors.XtraMessageBox.Show(ex.Message);
            }
            finally
            {
                SplashScreenTool.CloseSplashScreen();
                sw.Stop();
                TimeSpan tt = sw.Elapsed;
                if (resultFlag)
                    DevExpress.XtraEditors.XtraMessageBox.Show("数据计算成功，耗时：" + Math.Round(tt.TotalSeconds).ToString() + "秒！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                else
                    DevExpress.XtraEditors.XtraMessageBox.Show("数据计算失败，耗时：" + Math.Round(tt.TotalSeconds).ToString() + "秒！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            //此为初稿，仅供参考，并未同步与代码更新
            #region 需求注释
            //***A、基础数据准备

            //A0、物料基础数据维护
            //          a、板材平米重量
            //          须提前维护[WH_Mat_Unit_Weight_Per_Square](以下简称[板材平米重量表])
            //          格式为[MAT_TYPE],[MAT_THICK],[WEIGHT_PER_M2]，MES系统入口为[物料 - 基础数据 - 板材重量(平米)]

            //          b、铝材延米重量，改为从SAP直接取数
            //          须提前维护[WH_Mat_Unit_Weight_Per_Meter](以下简称[铝材延米重量表])
            //          格式为[MAT_NAME],[WEIGHT_PER_M]，MES系统入口为[物料 - 基础数据 - 铝材重量(米)]

            //          c、物料图纸对照，因铝材改为直接从SAP直接取数，所以不再维护
            //          须提前维护[WH_Mat_Drawing_Compatable](以下简称[物料图纸对照表])
            //          格式为[MAT_NAME],[DWG_NO],[SAP_NO]，MES系统入口为[物料 - 基础数据 - 物料图纸对照表]

            //A1、MES数据准备
            //          开料尺寸及工艺路线数据准备
            //          a、创建一个视图[View_SA_CBM_WT_Cutsize](以下简称[开料尺寸表])，保存物料最新版图纸的开料尺寸数据，
            //          格式为[物料号|图号|长|宽|厚|DECOR|Routing]
            //          视图关联表为[Lamex_MES].[dbo].[TRANSFER_PART]、 [LamexMESManager].[dbo].[Transfer_Panel_Cutting]
            //          [LamexMESManager].[dbo].[IE_Part_Routing] 、[LamexMESManager].[dbo].[IE_Routing_Combination]

            //          b、[Lamex_MES].[dbo].[TRANSFER_PART]逻辑为：
            //          筛选出同一[PART_NO]，[INSERT_TS]最大的记录的
            //           [PART_NO|DRAWING_NO|SINGLE_CUTTING_SIZE_X|SINGLE_CUTTING_SIZE_Y|THICKNESS|MATERIAL_CODE]，即[物料号|图号|长|宽|厚|DECOR]

            //          c、[LamexMESManager].[dbo].[Transfer_Panel_Cutting]逻辑为：
            //          筛选出同一[PART_NO]，[IMPORT_TIME]最大，且[CUTTING_SERIAL_NO]="001"的记录的
            //          [PART_NO|DWG_NO|SNG_CUT_SIZE_X|SNG_CUT_SIZE_Y|THICKNESS|MATERIAL_CODE]， 即[物料号|图号|长|宽|厚|DECOR]

            //          d、将b、c结果合并，[PART_NO]如有重复，只保留a结果
            //          e、通过[LamexMESManager].[dbo].[IE_Part_Routing]及[LamexMESManager].[dbo].[IE_Routing_Combination]的[GROUP_CODE]，返回[PART_NO]的[Routing]
            //          最终得到[物料号|图号|长|宽|厚|DECOR|Routing]

            //          ***如运算速度不理想，建议后期从SAP直接将物料开料尺寸传入[Transfer_MO_BOM](以下简称[MO_BOM表])
            //          ***即在[MO_BOM表]中增加物料DECOR、Routing，以及开料尺寸长、宽、厚5个字段
            //         

            //A2、SAP基础数据获取
            //          a、SAP接口准备，
            //          接口名为[ZBAPI_GET_MAT_VOL_WEI](以下简称[SAP接口])，返回格式为[物料|体积|体积单位|重量|重量单位|产品尺寸|DECOR|采购标记]

            //          b、包装体基础数据获取并更新
            //          获取[gridview1](以下简称[用户DN数据])包装体基础数据
            //          将当前[用户DN数据].[物料号]去重后，通过[SAP接口]，从SAP获取相关数据
            //          与[SA_CBM_WT_From_SAP](以下简称[SAP数据表]).[DISABLE_FLAG]为空的数据进行比对；
            //          如果数据不一致，则将已有记录标记为禁用，并将新数据写入[SAP数据表]

            //          c、MO BOM物料基础数据获取并更新
            //          通过[MO_BOM表]，获取当前[用户DN数据]所有MO BOM
            //          条件为[MO_BOM表].[Package_Mo_Main]=[用户DN数据].[生产订单]
            //          将获取的[MO_BOM表].[Material_No]去重后，通过[SAP接口]，从SAP获取相关数据
            //          与[SAP数据表].[DISABLE_FLAG]为空的数据进行比对；
            //          如果数据不一致，则将已有记录标记为禁用，并将新数据写入[SAP数据表]

            //A3、后台临时表创建
            //          创建临时表[SA_CBM_WT_CAL_TEMP](下称[临时DN表])
            //          表结构同[SA_CBM_WT_Calculated](下称[历史DN表])，不含保存用户及保存时间
            //          表数据同用户当前[用户DN数据]

            //A4、过滤须计算CBM及重量数据
            //          [临时DN表].[组件类型/计划行类别] != "CE" 及（和）"CN"

            //A5、优先取人工维护修正数据
            //          遍历[临时DN表]，如[MATERIAL_NO]在[WH_CBM_WT_Revised]表中有维护数据，
            //          取[UPDATE_TIME]最大记录[ACTUAL_WEIGHT]，及计算CBM=[ACTUAL_LENGTH]x[ACTUAL_LENGTH]x[ACTUAL_WIDTH]x[ACTUAL_HEIGHT]
            //          将CBM值、ACTUAL_WEIGHT，回刷到[临时DN表].[单位CBM]、[单位重量]

            //***B、OEM产品及配件CBM及重量计算

            //B1、判断是否为OEM产品
            //      遍历[临时DN表]，逻辑为[临时DN表].[产品类型]为[OEM]
            //      通过[临时DN表].[物料号]值，从[SAP数据表]表获取出CBM及重量（[DISABLE_FLAG]为空）
            //      将CBM及重量，回刷到[临时DN表].[单位CBM]及[单位重量]
            //      产品CBM及重量不取历史记录值，每次都取SAP最近维护值！！！

            //B2、判断是否为配件产品
            //      遍历[临时DN表]，逻辑为[临时DN表].[工艺路线]包含为[D54、P79、S20]（或关系）
            //      通过[临时DN表].[物料号]值，从[SAP数据表]表获取出CBM及重量（[DISABLE_FLAG]为空）
            //      将CBM及重量，回刷到[临时DN表].[单位CBM]及[单位重量]
            //      产品CBM及重量不取历史记录值，每次都取SAP最近维护值！！！

            //***C、非OEM产品非配件产品CBM及重量

            //C0、是否取历史DN数据？？？
            //          暂不取[历史DN表]，用户每次单击时都全部计算
            //          后期视运行速度情况再决定是否取历史记录，须用户提供准确逻辑，且能用户群能够准确理解


            //C1、计算非OEM非配件产品CBM

            //a、判断是否桌子组装产品
            //          逻辑为[临时DN表].[产品类型]为[Laminate],
            //          且[临时DN表].[物料号]工艺路线经过[D44、D47](柜桶柜子组装)

            //          b、如是桌子组装产品
            //              从[SAP数据表]表获取[DISABLE_FLAG]为空的[产品尺寸]值
            //              调用[产品尺寸法CBM解析计算]函数进行产品尺寸解析
            //              将CBM值，回刷到[临时DN表].[单位CBM]

            //          c、不是桌子组装产品
            //              
            //              c1、判断[临时DN表].[生产订单]是否为空
            //                      d、如[生产订单]为空，不处理

            //                      e、如[生产订单]不为空
            //                              创建[纸箱发料数据]数组，元素（变量）为[纸箱号|发料数量|纸箱CBM]，并初始化为空
            //                              创建[部件开料尺寸]临时表，元素为[物料号|发料数量|长|宽|厚|面积（长x宽）]数组，并初始化为空

            //                              遍历[临时DN表].[生产订单]的[MO_BOM表],条件为[MO_BOM表].[Package_Mo_Main]=[临时DN表].[生产订单]
            //                              调用[纸箱包装CBM解析计算]函数进行产品尺寸解析，并返回纸箱CBM值
            //                              将返回的CBM值，以及[MO_BOM表].[Demand_QTY]（发料数量）存入[纸箱发料数据]数组

            //                              e1、判断是否纸箱包装
            //                                      f、如果[纸箱发料数据]数组有数据，则表明是纸箱包装
            //                                          将数组CBM最大纸箱的[发料数量|纸箱CBM]，回刷到[临时DN表].[纸箱发料数|单位CBM]

            //                                      g、如果[纸箱发料数据]数组无数据，则为其他包装
            //                                          则再次遍历[临时DN表].[生产订单]的[MO_BOM表]
            //                                          通过视图[开料尺寸表]，获取[MO_BOM表].[Material_No]的开料尺寸，并存入[部件开料尺寸]临时表

            //                                          g1、判断是否有开料尺寸
            //                                                  h、完成遍历后，如果数组为空（包装体无开料尺寸数据），将CBM=0，回刷到[临时DN表].[单位CBM]

            //                                                  i、如果数组不为空，汇总[部件开料尺寸].[发料数量]

            //                                                          i1、判断是否单件板包装
            //                                                              j、如果[发料数量]汇总数为1，则CBM=(长+20)x(宽+20)x(厚+5)*发料数量，将CBM回刷到[临时DN表].[单位CBM]

            //                                                              k、如果[发料数量]汇总数大于1，分别计算[小板CBM]、[大板CBM]
            //                                                                   将[部件开料尺寸]表拆分成[经过小板线开料尺寸]（D24)、[不过小板线开料尺寸]（具体逻辑省略）
            //                                                                  计算[小板CBM]，[经过小板线部件开料尺寸]CBM（累加）汇总，即(长+20)x(宽+20)x(厚+5)*发料数量
            //                                                                  计算[大板CBM]，[不过小板线部件开料尺寸]CBM（堆叠）汇总，即最大面积板件）的(长+20)x(宽+20)x(部件总厚+5)*发料数量
            //                                                                  则CBM=[小板CBM]+ [大板CBM]，将CBM回刷到[临时DN表].[单位CBM]

            //C2、计算非OEM及非配件产品重量
            //          a、[称重计重法]
            //          遍历[临时DN表],[单位重量]为空，且[生产订单]不为空
            //          如果[产品类型]为Seating或MCG，则取[Transfer_Scanning_record].[ProdOrder]对应[Scale_weight]/[InsideQty]平均值（不取最近值及最大值）
            //          将[Scale_weight]，回刷到[临时DN表].[单位重量]

            //          b、[BOM计重法]，和D1为同级，不是包含或排他关系
            //          再次（重复）遍历[临时DN表],[单位重量]为空或0，且[生产订单]不为空
            //          如果[产品类型]为Laminate或Panel，则遍历[临时DN表].[物料号]
            //          通过[MO_BOM表].[Material_No]获取当前[MO_BOM表]
            //          遍历当前[MO_BOM表].[Material_No]      
            //          通过[Material_No]，获取[开料尺寸表].[DECOR]，[长、宽、厚]

            //              b1、判断物料是否为板材
            //                  遍历当前[MO_BOM表].[Material_No]     
            //                      c、如果[开料尺寸表].[长]不为空（有开料尺寸），则为板材
            //                              c1、判断板材是否通用DECOR
            //                                      d、如果[DECOR]不为空，且包含有"-"字符，解析 [DECOR]
            //                                              解析[DECOR]，从右往左，格式(XXX-)(S)S-(FF)F，如MFAS-25-MFC，解析结果：材质MFC，厚度25
            //                                              通过[DECOR]材质及厚度，比对[板材平米重量表].[MAT_TYPE]及[MAT_THICK]，
            //                                              返回[板材平米重量表].[WEIGHT_PER_M2]

            //                                      e、如果[DECOR]为空，或[DECOR]不包含有"-"字符（为物料号情况）
            //                                            通过[MFC]及[开料尺寸表].[厚]，比对[板材平米重量表].[MAT_TYPE]及[MAT_THICK]
            //                                              返回[板材平米重量表].[WEIGHT_PER_M2]

            //                              [板材重量]=[开料尺寸表].[长]x[宽]x[板材平米重量表].[WEIGHT_PER_M2]x[MO_BOM表].[发料数量]

            //                      f、如果[开料尺寸表].[长]为空，则为非板材，如铝材、玻璃、其他
            //                              f1、判断物料是否需要计重
            //                                      g、如果物料为“1”字头（原材料）
            //                                      h、或物料为“3”字头，且采购标记不为空（外发采购物料）
            //                                      i、通过[SAP数据表]，取到[SAP单位重量]，[物料重量]=[SAP单位重量].[发料数量]

            //          [BOM计重法]重量= [板材重量]+ [原材料重量]+ [采购物料重量]

            //X、***刷出无CBM或重量异常报表
            //          前提逻辑（同A4、[临时DN表].[组件类型] != "CE" 及（和）"CN"），且单位CBM或单位重量任意一项为0或空值
            //X1、OEM产品异常数据
            //          [产品类型]为[OEM]，按指定格式及内容发邮件跟进
            //X2、其他产品
            //          [产品类型]为非[OEM]，按指定格式及内容发邮件跟进


            //Y、***计算[临时DN表]出货CBM及重量
            //          前提逻辑（同A4、[临时DN表].[组件类型] != "CE" 及（和）"CN"）
            //Y1、计算[临时DN表].[出货体积]
            //Y2、遍历[临时DN表]
            //          如果[纸箱发料数]不为空，
            //          则[临时DN表].[出货体积]=ROUNDUP([出货数量]x[纸箱发料数],1）x[单位CBM]
            //          如果[纸箱发料数]为空，
            //          则[临时DN表].[出货体积]=[出货数量]x[单位CBM]

            //          将[临时DN表]结果返回[用户DN数据]

            //Z、***公共函数或方法

            //Z1、[产品尺寸法CBM解析计算]，返回[长、宽、高、CBM]，即根据产品尺寸解析并计算CBM
            //      a、通过[SAP数据表]表[产品尺寸]字段值，解析出物料的长、宽、高（厚）尺寸
            //      b、解析方法，将[产品尺寸]字符串是ASCII码为非数字及小数点的字符全部替换成特定字符
            //      c、最终解析出产品各向尺寸长、宽、高
            //      d、无法解析的CBM返回0值
            //      e、可以解析，则CBM=(长+20)x(宽+20)x(厚+5)，单位为m3

            //Z2、[纸箱包装CBM解析计算]，返回[纸箱号|发料数量|纸箱CBM]，即遍历MO BOM，解析并计算CBM
            //          遍历当前[MO_BOM表]
            //          如[MO_BOM表].[Material_Desc]包含 "纸箱，折盒，天地盒，天地盖，侧封箱，中封箱，普通箱"（或关系）（有风险？？？）
            //          通过[Material_No]，取[SAP数据表].[产品尺寸]
            //          通过[产品尺寸法CBM解析计算]方法返回[长、宽、高、CBM]
            #endregion
        }

        //表达式计算
        private void textEdit1_EditValueChanged(object sender, EventArgs e)
        {
            textEdit2.Text = SimpleRPN.ComputeRPN(textEdit1.Text);
        }

        //splitContainerControl位置同步，也可以用SplitterMoved事件，但SplitterMoving事件达不到效果
        private void splitContainerControl3_SplitterPositionChanged(object sender, EventArgs e)
        {
            splitContainerControl4.SplitterPosition = splitContainerControl3.SplitterPosition;
        }

        private void splitContainerControl4_SplitterPositionChanged(object sender, EventArgs e)
        {
            splitContainerControl3.SplitterPosition = splitContainerControl4.SplitterPosition;
        }

        public override void DoView(IButtonInfo sender)
        {
            sbtnRefresh_Click(null, null);
            base.DoView(sender);
        }

        public override void DoExport(IButtonInfo sender)
        {
            base.DoExport(sender);
        }

        #region GridView合并行、列 ，待开发

        #region 合并单元格 合并某一行的所有列

        ///　 <summary>　
        ///　 合并GridView中某行相同信息的行（单元格）
        ///　 </summary>　
        ///　 <param　 name="GridView1">GridView对象</param>　
        ///　 <param　 name="cellNum">需要合并的行</param>
        public static void GroupRow(GridView GridView1, int rows)
        {
            //TableCell oldTc = GridView1.Rows[rows].Cells[0];
            //for (int i = 1; i < GridView1.Rows[rows].Cells.Count; i++)
            //{
            //    TableCell tc = GridView1.Rows[rows].Cells[i];  //Cells[0]就是你要合并的列
            //    if (oldTc.Text == tc.Text)
            //    {
            //        tc.Visible = false;
            //        if (oldTc.ColumnSpan == 0)
            //        {
            //            oldTc.ColumnSpan = 1;
            //        }
            //        oldTc.ColumnSpan++;
            //        oldTc.VerticalAlign = VerticalAlign.Middle;
            //    }
            //    else
            //    {
            //        oldTc = tc;
            //    }
            //}
        }

        #endregion

        #region 合并单元格 合并一行中的几列

        /// <summary>
        /// 合并单元格 合并一行中的几列
        /// </summary>
        /// <param name="GridView1">GridView ID</param>
        /// <param name="rows">行</param>
        /// <param name="sCol">开始列</param>
        /// <param name="eCol">结束列</param>
        public static void GroupRow(GridView GridView1, int rows, int sCol, int eCol)
        {
            //TableCell oldTc = GridView1.Rows[rows].Cells[sCol];
            //for (int i = 1; i < eCol - sCol; i++)
            //{
            //    TableCell tc = GridView1.Rows[rows].Cells[i + sCol];  //Cells[0]就是你要合并的列
            //    tc.Visible = false;
            //    if (oldTc.ColumnSpan == 0)
            //    {
            //        oldTc.ColumnSpan = 1;
            //    }
            //    oldTc.ColumnSpan++;
            //    oldTc.VerticalAlign = VerticalAlign.Middle;
            //}
        }

        #endregion

        #region 合并单元格 合并某一列所有行

        /// <summary>
        /// 合并GridView中某列相同信息的行（单元格）
        /// </summary>
        /// <param name="GridView1"></param>
        /// <param name="cellNum"></param>
        public static void GroupCol(GridView GridView1, int cols)
        {
            //if (GridView1.Rows.Count < 1 || cols > GridView1.Rows[0].Cells.Count - 1)
            //{
            //    return;
            //}

            //TableCell oldTc = GridView1.Rows[0].Cells[cols];
            //for (int i = 1; i < GridView1.Rows.Count; i++)
            //{
            //    TableCell tc = GridView1.Rows[i].Cells[cols];
            //    if (oldTc.Text == tc.Text)
            //    {
            //        tc.Visible = false;
            //        if (oldTc.RowSpan == 0)
            //        {
            //            oldTc.RowSpan = 1;
            //        }
            //        oldTc.RowSpan++;
            //        oldTc.VerticalAlign = VerticalAlign.Middle;
            //    }
            //    else
            //    {
            //        oldTc = tc;
            //    }
            //}
        }

        #endregion

        #region 合并单元格 合并某一列中的某些行

        /// <summary>
        /// 合并单元格 合并某一列中的某些行
        /// </summary>
        /// <param name="GridView1">GridView ID</param>
        /// <param name="cellNum">列</param>
        /// <param name="sRow">开始行</param>
        /// <param name="eRow">结束列</param>
        public static void GroupCol(GridView GridView1, int cols, int sRow, int eRow)
        {
            //if (GridView1.Rows.Count < 1 || cols > GridView1.Columns.Count - 1)
            //{
            //    return;
            //}

            //TableCell oldTc = GridView1.Rows[sRow].Cells[cols];
            //for (int i = 1; i < eRow - sRow; i++)
            //{
            //    TableCell tc = GridView1.Rows[sRow + i].Cells[cols];
            //    tc.Visible = false;
            //    if (oldTc.RowSpan == 0)
            //    {
            //        oldTc.RowSpan = 1;
            //    }
            //    oldTc.RowSpan++;

            //    oldTc.VerticalAlign = VerticalAlign.Middle;
            //}
        }

        #endregion

        #endregion

        #region 自动焦点定位
        //SAP数据
        private void gridView2_Click(object sender, EventArgs e)
        {
            int iRow = gridView2.FocusedRowHandle;
            string strMaterial = gridView2.GetRowCellDisplayText(iRow, "MATERIAL_NO").ToString();
            //参数1：需点击Gridcontrol行物料号 | 参数2：定位的gridcontrol | 参数3：定位的gridview | 参数4：定位的物料Filename 
            GetFoucuseRowHandle(strMaterial, gridControl3, gridView3, "Material_No");
            GetFoucuseRowHandle(strMaterial, gridControl5, gridView5, "Material_No");
            GetFoucuseRowHandle(strMaterial, gridControl4, gridView4, "CartonID");
        }
        //MO_BOM列表
        private void gridView3_Click(object sender, EventArgs e)
        {
            int iRow = gridView3.FocusedRowHandle;
            string strMaterial = gridView3.GetRowCellDisplayText(iRow, "Material_No").ToString();
            GetFoucuseRowHandle(strMaterial, gridControl2, gridView2, "MATERIAL_NO");
            GetFoucuseRowHandle(strMaterial, gridControl5, gridView5, "Material_No");
            GetFoucuseRowHandle(strMaterial, gridControl4, gridView4, "CartonID");
        }
        //铝材、板材清单列表
        private void gridView5_Click(object sender, EventArgs e)
        {
            int iRow = gridView5.FocusedRowHandle;
            string strMaterial = gridView5.GetRowCellDisplayText(iRow, "Material_No").ToString();
            GetFoucuseRowHandle(strMaterial, gridControl2, gridView2, "MATERIAL_NO");
            GetFoucuseRowHandle(strMaterial, gridControl3, gridView3, "Material_No");
            GetFoucuseRowHandle(strMaterial, gridControl4, gridView4, "CartonID");
        }
        //纸箱清单
        private void gridView4_Click(object sender, EventArgs e)
        {
            int iRow = gridView4.FocusedRowHandle;
            string strMaterial = gridView4.GetRowCellDisplayText(iRow, "CartonID").ToString();
            GetFoucuseRowHandle(strMaterial, gridControl2, gridView2, "MATERIAL_NO");
            GetFoucuseRowHandle(strMaterial, gridControl3, gridView3, "Material_No");
            GetFoucuseRowHandle(strMaterial, gridControl5, gridView5, "Material_No");
        }
        //自动定位至焦点行
        public void GetFoucuseRowHandle(string strMaterial, GridControl gc, GridView gv, string topRowName)
        {
            string searchText = strMaterial;
            ColumnView view = (ColumnView)gc.FocusedView;
            GridColumn column = view.Columns[topRowName];//Material_No
            if (column != null)
            {
                // int rhFound = view.LocateByDisplayText(view.FocusedRowHandle, column, searchText);
                int rhFound = gv.LocateByValue(0, gv.Columns[topRowName], searchText);
                if (rhFound != GridControl.InvalidRowHandle)
                {
                    view.FocusedRowHandle = rhFound;
                    view.FocusedColumn = column;
                }
            }
        }

        #endregion


    }
}